package designpatterns.structure;

/**
 * 外观模式 隐藏系统的复杂性，并向客户端提供了一个客户端可以访问系统的接口
 * 使用场景：1、客户端不需要知道系统内部的复杂联系，整个系统只需提供一个"接待员"即可。
 * 2、定义系统的入口。
 * 优点：1、减少系统相互依赖； 2、提高灵活性； 3、提高了安全性。
 * 缺点：不符合开闭原则，如果要改东西很麻烦，继承重写都不合适。
 *
 * @author jack.wu
 * @since 2019/9/21
 */
public class FacadeTest {

    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();
        shapeMaker.drawRectangle();
        shapeMaker.drawSquare();
    }
}

interface Shape1 {
    void draw();
}

class Rectangle1 implements Shape1 {

    @Override
    public void draw() {
        System.out.println("Rectangle1 :: draw()");
    }
}

class Square1 implements Shape1 {
    @Override
    public void draw() {
        System.out.println("Square1 :: draw()");
    }
}

/**
 * 外观类
 */
class ShapeMaker {

    private Shape1 rectangle;
    private Shape1 square;

    public ShapeMaker() {
        this.rectangle = new Rectangle1();
        this.square = new Square1();
    }

    public void drawRectangle() {
        rectangle.draw();
    }

    public void drawSquare() {
        square.draw();
    }
}
